package cn.xz.thread_demo;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * 创建线程的方式三
 *              实现Callable接口 重写call方法
 *               方法带返回值，封装在FutureTask对象里
 *
 *           与实现Runnable接口的区别在于，其带有返回值，且返回值封装在FutureTask对象中，
 *           当需要获取返回值调用get方法时，主线程会被阻塞，等待调用的线程执行完毕，因为只有执行完毕才有返回值
 *
 *           当不去获取返回值的时候，主线程不会阻塞，属于异步执行
 */
public class CreateThreadByCallable implements Callable<String> {
    @Override
    public String call() throws Exception {
        System.out.println("实现Callable接口");
        return "实现Callable接口";
    }

    public static void main(String[] args) {
        CreateThreadByCallable createThreadByCallable = new CreateThreadByCallable();
        FutureTask<String> futureTask = new FutureTask<String>(createThreadByCallable);
        new Thread(futureTask).start();
        try {
            String s = futureTask.get();
            System.out.println(s);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        } catch (ExecutionException e) {
            throw new RuntimeException(e);
        }
        System.out.println("主线程执行");
    }
}
